package auth

import (
	"admin/dto"
	m "admin/models/auth"
	"admin/utils/pagination"

	"gorm.io/gorm"
)

// PermissionRepoInterface 权限仓库接口
type PermissionRepoInterface interface {
	List(req dto.PermissionListReq) (*pagination.PageResult[m.Permission], error)
	Create(p *m.Permission) error
	Update(p *m.Permission) error
	Delete(id int64) error
	GetPermissionByID(id int64) (*m.Permission, error)
}

// PermissionRepo 基于GORM的权限仓库实现
type PermissionRepo struct {
	db *gorm.DB
}

// NewGormPermissionRepository 创建基于GORM的权限仓库实例
// db: GORM数据库连接
// 返回值: 权限仓库实例指针
func NewPermissionRepo(db *gorm.DB) *PermissionRepo {
	return &PermissionRepo{
		db: db,
	}
}

// List 获取权限列表
// 返回值: 权限列表和错误信息
func (r *PermissionRepo) List(req dto.PermissionListReq) (*pagination.PageResult[m.Permission], error) {
	db := r.db.Model(&m.Permission{})
	if req.Keyword != "" {
		db = db.Where("code LIKE ? OR name LIKE ?", "%"+req.Keyword+"%", "%"+req.Keyword+"%")
	}
	var arr []m.Permission
	// 查询所有权限
	return pagination.Paginate[m.Permission](db, req.PageInfo, &arr)
}

// Create 创建权限
// p: 权限对象
// 返回值: 错误信息
func (r *PermissionRepo) Create(p *m.Permission) error {
	// 使用GORM创建权限
	return r.db.Create(p).Error
}

// Update 更新权限
// p: 权限对象
// 返回值: 错误信息
func (r *PermissionRepo) Update(p *m.Permission) error {
	// 使用GORM保存权限
	return r.db.Save(p).Error
}

// Delete 删除权限
// id: 权限ID
// 返回值: 错误信息
func (r *PermissionRepo) Delete(id int64) error {
	// 使用GORM删除指定ID的权限
	return r.db.Delete(&m.Permission{}, id).Error
}

// GetPermissionByID 根据ID获取权限
// id: 权限ID
// 返回值: 权限对象和错误信息
func (r *PermissionRepo) GetPermissionByID(id int64) (*m.Permission, error) {
	var obj m.Permission
	// 根据ID查询权限
	if err := r.db.First(&obj, id).Error; err != nil {
		return nil, err
	}
	return &obj, nil
}
